unit UEstoque;

interface

uses Classes, SysUtils, UIPattern;

type
  TEstoque = class(TInterfacedObject, ISujeito)
    private
      FSimbolo: String;
      FPreco: Double;
      FInvestidores: TInterfaceList;

      function LerSimbolo: String;
      function LerPreco: Double;
      procedure SetPreco(valor: Double);
    public
      constructor Create(Simbolo: String; Preco: Double);
      destructor Destroy;override;
      procedure Anexar(Observador: IObservador);
      procedure Desanexar(Observador: IObservador);
      procedure Notificar;

      property Simbolo: String read LerSimbolo;
      property Preco: Double read LerPreco write SetPreco;
  end;

implementation

{ Estoque }

procedure TEstoque.Anexar(Observador: IObservador);
begin
  if(FInvestidores = nil)then
  begin
    FInvestidores := TInterfaceList.Create;
  end;

  if(FInvestidores.IndexOf(Observador) < 0)then
  begin
    FInvestidores.Add(Observador);
  end;
end;

constructor TEstoque.Create(Simbolo: String; Preco: Double);
begin
  FSimbolo := Simbolo;
  FPreco := Preco;
end;

procedure TEstoque.Desanexar(Observador: IObservador);
begin
  if(FInvestidores <> nil)then
  begin
    FInvestidores.Remove(Observador);

    if(FInvestidores.Count = 0)then
    begin
      FInvestidores.Free;
      FInvestidores := nil;
    end;
  end;
end;

destructor TEstoque.Destroy;
begin
  FInvestidores.Free;
  inherited;
end;

function TEstoque.LerPreco: Double;
begin
  Result := FPreco;
end;

function TEstoque.LerSimbolo: String;
begin
  Result := FSimbolo;
end;

procedure TEstoque.Notificar;
  var
    ix: Integer;
begin
  if(FInvestidores <> nil)then
  begin
    for ix := 0 to Pred(FInvestidores.Count) do
    begin
      IObservador(FInvestidores[ix]).Atualizar(Self);
    end;
  end;
end;

procedure TEstoque.SetPreco(valor: Double);
begin
  if(valor <> FPreco)then
  begin
    FPreco := valor;
    Notificar;
  end;
end;

end.
 